<?php
/**
 * 模型基本类
 *
 * ============================================================================
 * 版权所有: (c) 2009-2011，<UEShop Inc>，并保留所有权利。
 * 网站地址: http://www.ueshop.cn
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 *
 * @author      cmpan
 * @copyright   Copyright (c) 2009-2011 UEShop Inc. (http://www.ueshop.cn)
 * @license     http://www.ueshop.cn/1_0.txt
 */
class UE_Model_Exception extends UE_Exception  {}
abstract class UE_Model extends UE_Object {
	public $id = 'id';

	public $table = '';

	public $key = '';
	
	/**
	 * 数据库对象
	 *
	 * @return UE_DB_Abstract
	 */
	protected static function _db() {
		return UE_DB::factory();
	}

	/**
	 * 设置主键的值
	 *
	 * @param string $id
	 * @return UE_Model
	 */
	public function setId($id) {		
		$this->id = $id;
		return $this;
	}
	
	/**
	 * 读取实体/模型信息
	 *
	 * @param string $id 主键的值, 如果为空则使用$this->id当前的值(上次设置的主键值)
	 * @return mixed false|array
	 */
	public function read($id = null) {	
		// 如果参数不为null则设置实体id
		if ($id !== null) {
			$this->id = $id;
		}
		
		if(! $this->check()) {
			return false;
		}
		
		return $this->_db()->getOne("SELECT * FROM {$this->table} WHERE {$this->key} = '{$this->id}'");
	}
	
	/**
	 * 更新实体
	 * 本函数比较安全的用法:
	 * $m->setId($PRIMARY_KEY_VALUE)->update($arr);
	 * 
	 * @param array $arr
	 * @return  int
	 */
	public function update($arr) {
		if(! $this->check()) {
			return false;
		}
		
		// 更新一条记录
		$rs = UE_DB::factory()->update($this->table, $this->key, $this->id, $arr);
		if ($rs === false) {
			$this->setErr(UE_DB::factory()->getLastErr());
		}
		UE_Cache::createCache()->clear();
		return $rs;
	}

	/**
	 * 删除实体
	 *
	 * @return bool
	 */
	public function delete() {
		if(! $this->check()) {
			return false;
		}
		
		//
		$rs = UE_DB::factory()->delete($this->table, $this->key, $this->id);
		
		if ($rs === false) {
			$this->setErr(UE_DB::factory()->getLastErr());
		}
		
		return $rs;
	}

	/**
	 * 验证当前模型是否已经初始化
	 *
	 * @return bool
	 */
	public function check() {
		if(empty($this->table)) {
			$this->_errs[] = UE_Lang::get('ue.model.tableNameEmpty');
			return false;
		}
		if(empty($this->key)) {
			$this->_errs[] = UE_Lang::get('ue.model.keyEmpty');
			return false;
		}
		if(strlen($this->id) <= 0) {
			$this->_errs[] = UE_Lang::get('ue.model.idEmpty');
			return false;
		}
		//
		return true;
	}
	
	/**
	 * 添加新的用户组
	 *
	 * @param array $data
	 * @return bool
	 */
	public function add($data) {		
		$db = UE_DB::factory();
		if(false === $db->insertRow($this->table, $data)) {
			$this->setErr($db->getLastErr());
			return false;
		}
		
		UE_Cache::createCache()->clear();
		
		return $db->lastInsertId();		
	}
	
	/**
	 * 获取总记录数
	 *
	 * @param array $arr 精确的匹配条件(=)
	 * @return int
	 */
	public function getTotals($arr = array()) {
		$where = '';
		foreach ($arr as $k=>$v) {
			$where .= " AND `$k`='$v'";
		}
		$sql = "SELECT COUNT({$this->key}) FROM {$this->table} WHERE true $where";
		$row = UE_DB::factory()->getfirstField($sql);
		return $row;
	}
}
